{"cells":[{"cell_type":"markdown","metadata":{"graffitiCellId":"id_j7o1a6n","jupyter":{},"tags":[],"slideshow":{"slide_type":"slide"},"id":"69262AB48D5C40E0893D46893CFE9B60","mdEditEnable":false},"source":"## course content\n\n1. lenet 模型介绍\n2. lenet 网络搭建\n3. 运用lenet进行图像识别-fashion-mnist数据集\n\n"},{"cell_type":"markdown","metadata":{"colab_type":"text","graffitiCellId":"id_ajekwu7","id":"Z4Mfv4K6dbhQ","jupyter":{},"tags":[],"slideshow":{"slide_type":"slide"},"mdEditEnable":false},"source":"#  Convolutional Neural Networks\n\n使用全连接层的局限性：\n\n- 图像在同一列邻近的像素在这个向量中可能相距较远。它们构成的模式可能难以被模型识别。\n- 对于大尺寸的输入图像，使用全连接层容易导致模型过大。\n\n使用卷积层的优势：\n\n- 卷积层保留输入形状。\n- 卷积层通过滑动窗口将同一卷积核与不同位置的输入重复计算，从而避免参数尺寸过大。\n\n\n"},{"attachments":{"%E5%9B%BE%E7%89%87.png":{"image/png":"iVBORw0KGgoAAAANSUhEUgAABOcAAAFzCAYAAAB1rW1DAAAgAElEQVR4nOzdW2xb94HH+b8sybpTtHyX6VC+1Ilo2fQ1ZmTHlJ165DgWbdfaxPGF42GQyKlTxoSM1tuYiibNOp2YTjzFbLGl2RYFOnA0QyMYuNUU4C7iRYV54c4GheaND0HmkfOQd+7Dbx/Y/+Hh4UWkdA7PIfk7wAdtZOqIl0OK/Or//x+RyWRAREREREREREREtSfMvgJERERERERERETNinGOiIiIiIiIiIjIJIxzREREREREREREJmGcIyIiIiIiIiIiMgnjHBERERERERERkUkY54iIiIiIiIiIiEzCOEdERERERERERGQSxjkiIiIiIiIiIiKTMM4RERERERERERGZhHGOiIiIiIiIiIjIJIxzREREREREREREJmGcIyIiIiIiIiIiMgnjHBERERERERERkUkY54iIiIiIiIiIiEzCOEdERERERERERGQSxjkiIiIiIiIiIiKTMM4RERERERERERGZhHGOiIiIiIiIiIjIJIxzREREREREREREJmGcIyIiIiIiIiIiMgnjHBERERERERERkUkY54iIiIiIiIiIiEzCOEdERERERERERGQSxjkiIiIiIiIiIiKTMM4RERERERERERGZhHGOiIiIiIiIiIjIJIxzREREREREREREJmGcIyIiIiIiIiIiMgnjHBERERERERERkUkY54iIiIiIiIiIiEzCOEdERERERERERGQSxjkiIiIiIiIiIiKTMM4RERERERERERGZhHGOiIiIiIiIiIjIJIxzREREREREREREJmGcIyIiIqKmkEgkEI/HddlXPB5HIpEw/TaRtcViMSSTyZL/TUTlpVIpxGIxpNNp068LkZEY54iIiIioKfj9fjidzqq/LxwOIxgM5n3N5/PB6/WafpvI2pxOJ/x+PzKZDNLpNIQQiEQipl8vonqRTCYhhNDtDytEVsU4R0RERERNYblxzufzwe12531Nz1F41Li0cS4WiyGVSpl+vYjqBeMcNQvGOSIiIiJalkqm56XT6YpiRDqd1mW6X7mfp2ecK6fS+FLpfUP6quaYrGQqXbnLqeOcHteLU/uoGaifC+XiXDXP5XKXk79/lnp+8fWajMQ4R0REREQVS6fTCAaDsNvtEEJACAG3212w/loikYDb7VYuU2w6n9Pp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"}},"cell_type":"markdown","metadata":{"graffitiCellId":"id_kpncnr4","jupyter":{},"tags":[],"slideshow":{"slide_type":"slide"},"id":"DCCD52CB4C38495789BA2C76F01D4332","mdEditEnable":false},"source":"## LeNet 模型\n\nLeNet分为卷积层块和全连接层块两个部分。下面我们分别介绍这两个模块。\n\n\n![Image Name](https://cdn.kesci.com/upload/image/q5ndwsmsao.png?imageView2/0/w/960/h/960)\n\n\n卷积层块里的基本单位是卷积层后接平均池化层：卷积层用来识别图像里的空间模式，如线条和物体局部，之后的平均池化层则用来降低卷积层对位置的敏感性。\n\n卷积层块由两个这样的基本单位重复堆叠构成。在卷积层块中，每个卷积层都使用$5 \\times 5$的窗口，并在输出上使用sigmoid激活函数。第一个卷积层输出通道数为6，第二个卷积层输出通道数则增加到16。\n\n全连接层块含3个全连接层。它们的输出个数分别是120、84和10，其中10为输出的类别个数。\n\n下面我们通过Sequential类来实现LeNet模型。"},{"cell_type":"code","execution_count":1,"metadata":{"colab":{},"colab_type":"code","graffitiCellId":"id_r0mf24i","id":"DHAr1_2J1jMC","jupyter":{},"tags":[],"slideshow":{"slide_type":"slide"},"collapsed":false,"scrolled":false},"outputs":[],"source":"#import\nimport sys\nsys.path.append(\"/home/kesci/input\")\nimport d2lzh1981 as d2l\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nimport time"},{"cell_type":"code","execution_count":2,"metadata":{"colab":{},"colab_type":"code","graffitiCellId":"id_jxhddby","id":"hp3vLYIbdbhd","jupyter":{},"tags":[],"slideshow":{"slide_type":"slide"},"collapsed":false,"scrolled":false},"outputs":[],"source":"#net\nclass Flatten(torch.nn.Module):  #展平操作\n    def forward(self, x):\n        return x.view(x.shape[0], -1)\n\nclass Reshape(torch.nn.Module): #将图像大小重定型\n    def forward(self, x):\n        return x.view(-1,1,28,28)      #(B x C x H x W)\n    \nnet = torch.nn.Sequential(     #Lelet                                                  \n    Reshape(),\n    nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5, padding=2), #b*1*28*28  =>b*6*28*28\n    nn.Sigmoid(),                                                       \n    nn.AvgPool2d(kernel_size=2, stride=2),                              #b*6*28*28  =>b*6*14*14\n    nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5),           #b*6*14*14  =>b*16*10*10\n    nn.Sigmoid(),\n    nn.AvgPool2d(kernel_size=2, stride=2),                              #b*16*10*10  => b*16*5*5\n    Flatten(),                                                          #b*16*5*5   => b*400\n    nn.Linear(in_features=16*5*5, out_features=120),\n    nn.Sigmoid(),\n    nn.Linear(120, 84),\n    nn.Sigmoid(),\n    nn.Linear(84, 10)\n)"},{"cell_type":"markdown","metadata":{"colab_type":"text","graffitiCellId":"id_00eauaf","id":"OnaREs_Zdbhg","jupyter":{},"tags":[],"slideshow":{"slide_type":"slide"},"mdEditEnable":false},"source":"接下来我们构造一个高和宽均为28的单通道数据样本，并逐层进行前向计算来查看每个层的输出形状。"},{"cell_type":"code","execution_count":3,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":238},"colab_type":"code","graffitiCellId":"id_l3of2c4","id":"yiamwgtvdbhh","outputId":"88be586b-b793-48b7-f4e2-7e598cecd22e","jupyter":{},"tags":[],"slideshow":{"slide_type":"slide"},"collapsed":false,"scrolled":false},"outputs":[{"output_type":"stream","text":"Reshape output shape: \t torch.Size([1, 1, 28, 28])\nConv2d output shape: \t torch.Size([1, 6, 28, 28])\nSigmoid output shape: \t torch.Size([1, 6, 28, 28])\nAvgPool2d output shape: \t torch.Size([1, 6, 14, 14])\nConv2d output shape: \t torch.Size([1, 16, 10, 10])\nSigmoid output shape: \t torch.Size([1, 16, 10, 10])\nAvgPool2d output shape: \t torch.Size([1, 16, 5, 5])\nFlatten output shape: \t torch.Size([1, 400])\nLinear output shape: \t torch.Size([1, 120])\nSigmoid output shape: \t torch.Size([1, 120])\nLinear output shape: \t torch.Size([1, 84])\nSigmoid output shape: \t torch.Size([1, 84])\nLinear output shape: \t torch.Size([1, 10])\n","name":"stdout"}],"source":"#print\nX = torch.randn(size=(1,1,28,28), dtype = torch.float32)\nfor layer in net:\n    X = layer(X)\n    print(layer.__class__.__name__,'output shape: \\t',X.shape)"},{"attachments":{"%E5%9B%BE%E7%89%87.png":{"image/png":"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"}},"cell_type":"markdown","metadata":{"colab_type":"text","graffitiCellId":"id_0ppp3nj","id":"fzicoTnEdbhl","jupyter":{},"tags":[],"slideshow":{"slide_type":"slide"},"mdEditEnable":false},"source":"可以看到，在卷积层块中输入的高和宽在逐层减小。卷积层由于使用高和宽均为5的卷积核，从而将高和宽分别减小4，而池化层则将高和宽减半，但通道数则从1增加到16。全连接层则逐层减少输出个数，直到变成图像的类别数10。\n\n\n![Image Name](https://cdn.kesci.com/upload/image/q5ndxi6jl5.png?imageView2/0/w/640/h/640)\n"},{"cell_type":"markdown","metadata":{"colab_type":"text","graffitiCellId":"id_p1kzp1a","id":"BnKUIw6Ddbhr","jupyter":{},"tags":[],"slideshow":{"slide_type":"slide"},"mdEditEnable":false},"source":"## 获取数据和训练模型\n\n下面我们来实现LeNet模型。我们仍然使用Fashion-MNIST作为训练数据集。"},{"cell_type":"code","execution_count":4,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":275},"colab_type":"code","graffitiCellId":"id_f0dgnij","id":"ECMwOKTzdbhr","outputId":"9a7f2ac9-c95b-4bbb-e902-dcfbfd16301a","scrolled":false,"jupyter":{},"tags":[],"slideshow":{"slide_type":"slide"},"collapsed":false},"outputs":[{"output_type":"stream","text":"235\n","name":"stdout"}],"source":"# 数据\nbatch_size = 256\ntrain_iter, test_iter = d2l.load_data_fashion_mnist(\n    batch_size=batch_size, root='/home/kesci/input/FashionMNIST2065')\nprint(len(train_iter))\n"},{"cell_type":"markdown","metadata":{"graffitiCellId":"id_uge3tcz","jupyter":{},"tags":[],"slideshow":{"slide_type":"slide"},"id":"D38DDA51EF0D4AFE809003A1686CDA11","mdEditEnable":false},"source":"为了使读者更加形象的看到数据，添加额外的部分来展示数据的图像"},{"cell_type":"code","execution_count":5,"metadata":{"graffitiCellId":"id_d5nld6i","jupyter":{},"tags":[],"slideshow":{"slide_type":"slide"},"id":"4FE5CE6E20494BFE898E9D8EAAF30C7B","collapsed":false,"scrolled":false},"outputs":[{"output_type":"stream","text":"torch.Size([1, 28, 28]) 3\ntorch.Size([1, 28, 28]) 8\ntorch.Size([1, 28, 28]) 1\ntorch.Size([1, 28, 28]) 4\ntorch.Size([1, 28, 28]) 0\ntorch.Size([1, 28, 28]) 0\ntorch.Size([1, 28, 28]) 4\ntorch.Size([1, 28, 28]) 9\ntorch.Size([1, 28, 28]) 4\ntorch.Size([1, 28, 28]) 7\n","name":"stdout"},{"output_type":"display_data","metadata":{"needs_background":"light"},"data":{"text/plain":"<Figure size 864x864 with 10 Axes>","text/html":"<img src=\"https://cdn.kesci.com/rt_upload/4FE5CE6E20494BFE898E9D8EAAF30C7B/q5ndypu2sq.svg\">"},"transient":{}}],"source":"#数据展示\nimport matplotlib.pyplot as plt\ndef show_fashion_mnist(images, labels):\n    d2l.use_svg_display()\n    # 这里的_表示我们忽略（不使用）的变量\n    _, figs = plt.subplots(1, len(images), figsize=(12, 12))\n    for f, img, lbl in zip(figs, images, labels):\n        f.imshow(img.view((28, 28)).numpy())\n        f.set_title(lbl)\n        f.axes.get_xaxis().set_visible(False)\n        f.axes.get_yaxis().set_visible(False)\n    plt.show()\n\nfor Xdata,ylabel in train_iter:\n    break\nX, y = [], []\nfor i in range(10):\n    print(Xdata[i].shape,ylabel[i].numpy())\n    X.append(Xdata[i]) # 将第i个feature加到X中\n    y.append(ylabel[i].numpy()) # 将第i个label加到y中\nshow_fashion_mnist(X, y)"},{"cell_type":"markdown","metadata":{"colab_type":"text","graffitiCellId":"id_qw3jw30","id":"Gg8uZka5dbhu","jupyter":{},"tags":[],"slideshow":{"slide_type":"slide"},"mdEditEnable":false},"source":"因为卷积神经网络计算比多层感知机要复杂，建议使用GPU来加速计算。我们查看看是否可以用GPU，如果成功则使用`cuda:0`，否则仍然使用`cpu`。"},{"cell_type":"code","execution_count":6,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":34},"colab_type":"code","graffitiCellId":"id_xnv8h9s","id":"Y3zs_KyHdbhv","outputId":"da77a9d2-55c9-4781-8132-7ebba7f6f3f6","jupyter":{},"tags":[],"slideshow":{"slide_type":"slide"},"collapsed":false,"scrolled":false},"outputs":[{"output_type":"execute_result","metadata":{},"data":{"text/plain":"device(type='cpu')"},"transient":{},"execution_count":6}],"source":"# This function has been saved in the d2l package for future use\n#use GPU\ndef try_gpu():\n    \"\"\"If GPU is available, return torch.device as cuda:0; else return torch.device as cpu.\"\"\"\n    if torch.cuda.is_available():\n        device = torch.device('cuda:0')\n    else:\n        device = torch.device('cpu')\n    return device\n\ndevice = try_gpu()\ndevice"},{"cell_type":"markdown","metadata":{"colab_type":"text","graffitiCellId":"id_t2kmxh8","id":"nhhHxEjVdbhz","jupyter":{},"tags":[],"slideshow":{"slide_type":"slide"},"mdEditEnable":false},"source":"我们实现`evaluate_accuracy`函数，该函数用于计算模型`net`在数据集`data_iter`上的准确率。"},{"cell_type":"code","execution_count":7,"metadata":{"colab":{},"colab_type":"code","graffitiCellId":"id_x6dxfdo","id":"g4iEi1U8dbh0","jupyter":{},"tags":[],"slideshow":{"slide_type":"slide"},"collapsed":false,"scrolled":false},"outputs":[],"source":"\n#计算准确率\n'''\n(1). net.train()\n  启用 BatchNormalization 和 Dropout，将BatchNormalization和Dropout置为True\n(2). net.eval()\n不启用 BatchNormalization 和 Dropout，将BatchNormalization和Dropout置为False\n'''\n\ndef evaluate_accuracy(data_iter, net,device=torch.device('cpu')):\n    \"\"\"Evaluate accuracy of a model on the given data set.\"\"\"\n    acc_sum,n = torch.tensor([0],dtype=torch.float32,device=device),0\n    for X,y in data_iter:\n        # If device is the GPU, copy the data to the GPU.\n        X,y = X.to(device),y.to(device)\n        net.eval()\n        with torch.no_grad():\n            y = y.long()\n            acc_sum += torch.sum((torch.argmax(net(X), dim=1) == y))  #[[0.2 ,0.4 ,0.5 ,0.6 ,0.8] ,[ 0.1,0.2 ,0.4 ,0.3 ,0.1]] => [ 4 , 2 ]\n            n += y.shape[0]\n    return acc_sum.item()/n"},{"cell_type":"markdown","metadata":{"colab_type":"text","graffitiCellId":"id_ccpg4oo","id":"qZj0UJ91dbh3","jupyter":{},"tags":[],"slideshow":{"slide_type":"slide"},"mdEditEnable":false},"source":"我们定义函数`train_ch5`，用于训练模型。"},{"cell_type":"code","execution_count":8,"metadata":{"colab":{},"colab_type":"code","graffitiCellId":"id_e22sitj","id":"WQ8PZBb4dbh4","jupyter":{},"tags":[],"slideshow":{"slide_type":"slide"},"collapsed":false,"scrolled":false},"outputs":[],"source":"#训练函数\ndef train_ch5(net, train_iter, test_iter,criterion, num_epochs, batch_size, device,lr=None):\n    \"\"\"Train and evaluate a model with CPU or GPU.\"\"\"\n    print('training on', device)\n    net.to(device)\n    optimizer = optim.SGD(net.parameters(), lr=lr)\n    for epoch in range(num_epochs):\n        train_l_sum = torch.tensor([0.0],dtype=torch.float32,device=device)\n        train_acc_sum = torch.tensor([0.0],dtype=torch.float32,device=device)\n        n, start = 0, time.time()\n        for X, y in train_iter:\n            net.train()\n            \n            optimizer.zero_grad()\n            X,y = X.to(device),y.to(device) \n            y_hat = net(X)\n            loss = criterion(y_hat, y)\n            loss.backward()\n            optimizer.step()\n            \n            with torch.no_grad():\n                y = y.long()\n                train_l_sum += loss.float()\n                train_acc_sum += (torch.sum((torch.argmax(y_hat, dim=1) == y))).float()\n                n += y.shape[0]\n        test_acc = evaluate_accuracy(test_iter, net,device)\n        print('epoch %d, loss %.4f, train acc %.3f, test acc %.3f, '\n              'time %.1f sec'\n              % (epoch + 1, train_l_sum/n, train_acc_sum/n, test_acc,\n                 time.time() - start))"},{"cell_type":"markdown","metadata":{"colab_type":"text","graffitiCellId":"id_o8t94tl","id":"QCTjn-iRdbh6","jupyter":{},"tags":[],"slideshow":{"slide_type":"slide"},"mdEditEnable":false},"source":"我们重新将模型参数初始化到对应的设备`device`(`cpu` or `cuda:0`)之上，并使用Xavier随机初始化。损失函数和训练算法则依然使用交叉熵损失函数和小批量随机梯度下降。"},{"cell_type":"code","execution_count":9,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":119},"colab_type":"code","graffitiCellId":"id_k8iyyir","id":"SRwnEh4ndbh7","outputId":"abcc9495-ed33-41a2-c6f5-7bcb8b82c3e4","scrolled":false,"jupyter":{},"tags":[],"slideshow":{"slide_type":"slide"},"collapsed":false},"outputs":[{"output_type":"stream","text":"training on cpu\nepoch 1, loss 0.0091, train acc 0.100, test acc 0.168, time 21.6 sec\nepoch 2, loss 0.0065, train acc 0.355, test acc 0.599, time 21.5 sec\nepoch 3, loss 0.0035, train acc 0.651, test acc 0.665, time 21.8 sec\nepoch 4, loss 0.0028, train acc 0.717, test acc 0.723, time 21.7 sec\nepoch 5, loss 0.0025, train acc 0.746, test acc 0.753, time 21.4 sec\nepoch 6, loss 0.0023, train acc 0.767, test acc 0.754, time 21.5 sec\nepoch 7, loss 0.0022, train acc 0.782, test acc 0.785, time 21.3 sec\nepoch 8, loss 0.0021, train acc 0.798, test acc 0.791, time 21.8 sec\nepoch 9, loss 0.0019, train acc 0.811, test acc 0.790, time 22.0 sec\nepoch 10, loss 0.0019, train acc 0.821, test acc 0.804, time 22.1 sec\n","name":"stdout"}],"source":"# 训练\nlr, num_epochs = 0.9, 10\n\ndef init_weights(m):\n    if type(m) == nn.Linear or type(m) == nn.Conv2d:\n        torch.nn.init.xavier_uniform_(m.weight)\n\nnet.apply(init_weights)\nnet = net.to(device)\n\ncriterion = nn.CrossEntropyLoss()   #交叉熵描述了两个概率分布之间的距离，交叉熵越小说明两者之间越接近\ntrain_ch5(net, train_iter, test_iter, criterion,num_epochs, batch_size,device, lr)"},{"cell_type":"code","execution_count":10,"metadata":{"graffitiCellId":"id_y3tdhvt","jupyter":{},"tags":[],"slideshow":{"slide_type":"slide"},"id":"6C2C48F49CD24FB38F6B313B6EC1983F","collapsed":false,"scrolled":false},"outputs":[{"output_type":"stream","text":"torch.Size([256, 1, 28, 28]) torch.Size([256])\ntensor([9, 2, 1, 1, 6, 1, 2, 6, 5, 7])\ntensor([9, 2, 1, 1, 6, 1, 4, 6, 5, 7])\n","name":"stdout"}],"source":"# test\nfor testdata,testlabe in test_iter:\n    testdata,testlabe = testdata.to(device),testlabe.to(device)\n    break\nprint(testdata.shape,testlabe.shape)\nnet.eval()\ny_pre = net(testdata)\nprint(torch.argmax(y_pre,dim=1)[:10])\nprint(testlabe[:10])"},{"cell_type":"markdown","metadata":{"colab_type":"text","graffitiCellId":"id_xwmnzx5","id":"pRUx8zxq1XmD","jupyter":{},"tags":[],"slideshow":{"slide_type":"slide"},"mdEditEnable":false},"source":"## 总结：\n\n卷积神经网络就是含卷积层的网络。\nLeNet交替使用卷积层和最大池化层后接全连接层来进行图像分类。"}],"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.7.3","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}